package cn.tedu.datamanager.serve.ipml;


import cn.tedu.datamanager.ex.ServiceException;
import cn.tedu.datamanager.mapper.ServicesMapper;
import cn.tedu.datamanager.pojo.dto.ServicesAddNewDTO;
import cn.tedu.datamanager.pojo.entity.Services;
import cn.tedu.datamanager.pojo.vo.ServicesListItemVO;
import cn.tedu.datamanager.serve.IServicesService;
import cn.tedu.datamanager.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理服务项目数据的业务实现类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Service
public class ServicesServiceImpl implements IServicesService {
    @Autowired
    ServicesMapper servicesMapper;

    @Override
    public List<ServicesListItemVO> list() {
        log.debug("开始处理【查询服务项目列表】的业务");
        // 调用Mapper查询服务项目列表
        List<ServicesListItemVO> list = servicesMapper.list();
        // 返回
        return list;
    }

    @Override
    public void delete(long serveId) {
        log.debug("开始处理【删除服务项目】的业务,id={}", serveId);
        //根据id查询服务项目数据
        //判断服务项目是否存在
        ServicesListItemVO queryResult = servicesMapper.getStandardById(serveId);
        if (queryResult == null) {
            String message = "删除服务项目失败,尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        int rows = servicesMapper.delete(serveId);
        if (rows < 1) {
            String message = "删除服务项目失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public int setEnable(Long Id) {

        log.debug("开始处理【启用服务项目】的业务,serveId={}", Id);
        ServicesListItemVO queryResult = servicesMapper.getStandardById(Id);
        if (queryResult == null) {
            String message = "启用服务项目失败,尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        if (queryResult.getEnable() == 1) {
            String message = "该服务项目已经启用,请勿重复操作!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }


        Services admin = new Services();
        admin.setId(Id);
        admin.setEnable(1);

        int rows = servicesMapper.updateById(admin);
        if (rows != 1) {
            String message = "启用服务项目失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
        return rows;
    }

    @Override
    public int setDisable(Long Id) {
        log.debug("开始处理【停用服务项目】的业务,Id={}", Id);
        ServicesListItemVO queryResult = servicesMapper.getStandardById(Id);
        if (queryResult == null) {
            String message = "停用服务项目失败,尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        if (queryResult.getEnable() == 0) {
            String message = "该服务项目已经停用,请勿重复操作!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        Services admin = new Services();
        admin.setId(Id);
        admin.setEnable(0);

        int rows = servicesMapper.updateById(admin);
        if (rows != 1) {
            String message = "停用服务项目失败,服务器忙,请稍后再试!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
        return rows;
    }


    @Override
    public void addNew(ServicesAddNewDTO servicesAddNewDTO) {

        log.debug("开始处理【添加服务项目】的业务，参数：{}", servicesAddNewDTO);

        // 从参数albumAddNewDTO中获取尝试添加的服务项目名称
        long id = servicesAddNewDTO.getServeId();
        // 检查此服务项目名称是否已经存在：调用Mapper对象的countByName()方法，判断结果是否不为0
        int count = servicesMapper.countByServeId(id);
        if (count != 0) {
            // 是：名称已存在，不允许创建，抛出异常
            String message = "添加服务项目失败，尝试添加的服务项目编号已经被占用！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 从参数albumAddNewDTO中获取尝试添加的服务项目名称
        String name = servicesAddNewDTO.getServicename();
        // 检查此服务项目名称是否已经存在：调用Mapper对象的countByName()方法，判断结果是否不为0
        count = servicesMapper.countByServeName(name);
        if (count != 0) {
            // 是：名称已存在，不允许创建，抛出异常
            String message = "添加服务项目失败，尝试添加的服务项目名称已经被占用！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建Album对象
        Services album = new Services();
        // 将参数DTO中的数据复制到Album对象中
        BeanUtils.copyProperties(servicesAddNewDTO, album);
        log.debug("即将插入服务项目数据：{}", album);
        // 调用Mapper对象的insert()方法，插入服务项目数据
        servicesMapper.insert(album);
    }

    @Override
    public ServicesListItemVO selectupdate(Long Id) {
        ServicesListItemVO queryResult = servicesMapper.getStandardById(Id);
        if (queryResult == null) {
            String message = "查询服务项目失败,尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        ServicesListItemVO rows = servicesMapper.selectupdate(Id);
        return rows;
    }

    @Override
    public void update(ServicesAddNewDTO servicesAddNewDTO) {
        log.debug("开始处理【修改服务项目】的业务，参数：{}", servicesAddNewDTO);

        // 从参数albumAddNewDTO中获取尝试添加的服务项目名称
        // 检查此服务项目名称是否已经存在：调用Mapper对象的countByName()方法，判断结果是否不为0

        // 从参数albumAddNewDTO中获取尝试添加的服务项目名称
        String name = servicesAddNewDTO.getServicename();
        // 检查此服务项目名称是否已经存在：调用Mapper对象的countByName()方法，判断结果是否不为0
        if (name == null) {
            String message = "修改服务项目失败,尝试访问的数据不存在!";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
// 创建Album对象
        Services album = new Services();
//        // 将参数DTO中的数据复制到Album对象中
        BeanUtils.copyProperties(servicesAddNewDTO, album);
//        log.debug("即将插入服务项目数据：{}", album);
//        // 调用Mapper对象的insert()方法，插入服务项目数据
        log.debug("即将修改的数据为:"+album);
        servicesMapper.update(servicesAddNewDTO);
    }

}
